
package com.curlymaster.podcastalarmclock;

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.app.ProgressDialog;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class AndroidFileDownloader extends Activity implements OnClickListener
{
	// Used to communicate state changes in the DownloaderThread
	public static final int MESSAGE_DOWNLOAD_STARTED = 1000;
	public static final int MESSAGE_DOWNLOAD_COMPLETE = 1001;
	public static final int MESSAGE_UPDATE_PROGRESS_BAR = 1002;
	public static final int MESSAGE_DOWNLOAD_CANCELED = 1003;
	public static final int MESSAGE_CONNECTING_STARTED = 1004;
	public static final int MESSAGE_ENCOUNTERED_ERROR = 1005;
	public static final int XML_DOWNLOAD = 1006;
	public static final int MP3_DOWNLOAD = 1007;
	
	// instance variables
	private AndroidFileDownloader thisActivity;
	private Thread downloaderThread;
	private ProgressDialog progressDialog;
	private TextView tvpodcasturl;
	//private String xmlFilePath ;
	private String urlMp3;
	//private String mp3FilePath;
	private XmlReader reader;
	private Button btnDownloadMp3;
	private Button btnDownloadXml;
	private Button btnListen;
	private Button btnStop;
	private  MediaPlayer mPlayer;
	public SdManager sdManager;
	
	
	
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        thisActivity = this;
        downloaderThread = null;
        progressDialog = null;
        setContentView(R.layout.main);
        
        btnDownloadXml = (Button) this.findViewById(R.id.btnDownloadXml);
        btnDownloadMp3 = (Button) this.findViewById(R.id.btnDownloadMp3);
        btnListen = (Button) this.findViewById(R.id.btnListen);
        
        btnStop = (Button) this.findViewById(R.id.btnStop);
        btnStop.setClickable(false);
        
        tvpodcasturl = (TextView) findViewById(R.id.tvpodcasturl);
        
        btnDownloadXml.setOnClickListener(this);
        btnDownloadMp3.setOnClickListener(this);
        btnStop.setOnClickListener(this);
        
        btnDownloadMp3.setClickable(false);
        btnListen.setOnClickListener(this);
        mPlayer = new MediaPlayer();
        
        /*
         * Sd manager will be managing all acces to the sd card
         */
        sdManager = new SdManager();
        
        
        
        
    }

    /** Called when the user clicks on something. */
	@Override
	public void onClick(View view)
	{
		switch(view.getId())
		{
			case R.id.btnDownloadXml:
			{
				/**button that download the xml file for furtther use**/
				EditText urlInputField = (EditText) this.findViewById(R.id.url_input);
				String urlInput = urlInputField.getText().toString();
				downloaderThread = new DownloaderThread(thisActivity, urlInput,XML_DOWNLOAD);
				downloaderThread.start();
				break;
			}
			
			case R.id.btnDownloadMp3:
			{
				/** button that downloads the map file with the url that is in the xml file**/
				File file =new File(sdManager.getMp3FilePath());
			
				reader = new XmlReader(thisActivity);
				urlMp3 = reader.getPodcastUrl();
				reader.close();
				
				tvpodcasturl.setText(urlMp3);
				if(!file.exists())
				{
					downloaderThread = new DownloaderThread(thisActivity, urlMp3,MP3_DOWNLOAD);
					downloaderThread.start();
				}
					break;
			}
			
			case R.id.btnListen:
			{
				btnStop.setClickable(true);
				
				if(!mPlayer.isPlaying())
				{
				
				
					/**button that plays the mp3 file that was download earlier**/
					mPlayer.setLooping(false);
					tvpodcasturl.setText("starting");
					
					
					try {
							mPlayer.setDataSource(sdManager.getMp3FilePath());
							mPlayer.prepare();
							mPlayer.start();
							
							/**testing section**/
							if(mPlayer.isPlaying())
							{
								tvpodcasturl.setText("playing");
							}
							else
							{
								tvpodcasturl.setText("notPlaying");
							
							}
							
							/**testing section**/
							
					} catch (IllegalArgumentException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IllegalStateException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				break;
			}
			
			case R.id.btnStop:
			{
				mPlayer.stop();
				break;
			}
			
			
		}
		
		
		
	}
	
	/**
	 * This is the Handler for this activity. It will receive messages from the
	 * DownloaderThread and make the necessary updates to the UI.
	 */
	public Handler activityHandler = new Handler()
	{
		public void handleMessage(Message msg)
		{
			switch(msg.what)
			{
				/*
				 * Handling MESSAGE_UPDATE_PROGRESS_BAR:
				 * 1. Get the current progress, as indicated in the arg1 field
				 *    of the Message.
				 * 2. Update the progress bar.
				 */
				case MESSAGE_UPDATE_PROGRESS_BAR:
					if(progressDialog != null)
					{
						int currentProgress = msg.arg1;
						progressDialog.setProgress(currentProgress);
					}
					break;
				
				/*
				 * Handling MESSAGE_CONNECTING_STARTED:
				 * 1. Get the URL of the file being downloaded. This is stored
				 *    in the obj field of the Message.
				 * 2. Create an indeterminate progress bar.
				 * 3. Set the message that should be sent if user cancels.
				 * 4. Show the progress bar.
				 */
				case MESSAGE_CONNECTING_STARTED:
					if(msg.obj != null && msg.obj instanceof String)
					{
						String url = (String) msg.obj;
						// truncate the url
						if(url.length() > 16)
						{
							String tUrl = url.substring(0, 15);
							tUrl += "...";
							url = tUrl;
						}
						String pdTitle = thisActivity.getString(R.string.progress_dialog_title_connecting);
						String pdMsg = thisActivity.getString(R.string.progress_dialog_message_prefix_connecting);
						pdMsg += " " + url;
						
						dismissCurrentProgressDialog();
						progressDialog = new ProgressDialog(thisActivity);
						progressDialog.setTitle(pdTitle);
						progressDialog.setMessage(pdMsg);
						progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
						progressDialog.setIndeterminate(true);
						// set the message to be sent when this dialog is canceled
						Message newMsg = Message.obtain(this, MESSAGE_DOWNLOAD_CANCELED);
						progressDialog.setCancelMessage(newMsg);
						progressDialog.show();
					}
					break;
					
				/*
				 * Handling MESSAGE_DOWNLOAD_STARTED:
				 * 1. Create a progress bar with specified max value and current
				 *    value 0; assign it to progressDialog. The arg1 field will
				 *    contain the max value.
				 * 2. Set the title and text for the progress bar. The obj
				 *    field of the Message will contain a String that
				 *    represents the name of the file being downloaded.
				 * 3. Set the message that should be sent if dialog is canceled.
				 * 4. Make the progress bar visible.
				 */
				case MESSAGE_DOWNLOAD_STARTED:
					// obj will contain a String representing the file name
					if(msg.obj != null && msg.obj instanceof String)
					{
						int maxValue = msg.arg1;
						String fileName = (String) msg.obj;
						String pdTitle = thisActivity.getString(R.string.progress_dialog_title_downloading);
						String pdMsg = thisActivity.getString(R.string.progress_dialog_message_prefix_downloading);
						pdMsg += " " + fileName;
						
						dismissCurrentProgressDialog();
						progressDialog = new ProgressDialog(thisActivity);
						progressDialog.setTitle(pdTitle);
						progressDialog.setMessage(pdMsg);
						progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
						progressDialog.setProgress(0);
						progressDialog.setMax(maxValue);
						// set the message to be sent when this dialog is canceled
						Message newMsg = Message.obtain(this, MESSAGE_DOWNLOAD_CANCELED);
						progressDialog.setCancelMessage(newMsg);
						progressDialog.setCancelable(true);
						progressDialog.show();
					}
					break;
				
				/*
				 * Handling MESSAGE_DOWNLOAD_COMPLETE:
				 * 1. Remove the progress bar from the screen.
				 * 2. Display Toast that says download is complete.
				 */
				case MESSAGE_DOWNLOAD_COMPLETE:
					dismissCurrentProgressDialog();
					displayMessage(getString(R.string.user_message_download_complete));					 
					btnDownloadMp3.setClickable(true);
					
					break;
					
				/*
				 * Handling MESSAGE_DOWNLOAD_CANCELLED:
				 * 1. Interrupt the downloader thread.
				 * 2. Remove the progress bar from the screen.
				 * 3. Display Toast that says download is complete.
				 */
				case MESSAGE_DOWNLOAD_CANCELED:
					if(downloaderThread != null)
					{
						downloaderThread.interrupt();
					}
					dismissCurrentProgressDialog();
					displayMessage(getString(R.string.user_message_download_canceled));
					break;
				
				/*
				 * Handling MESSAGE_ENCOUNTERED_ERROR:
				 * 1. Check the obj field of the message for the actual error
				 *    message that will be displayed to the user.
				 * 2. Remove any progress bars from the screen.
				 * 3. Display a Toast with the error message.
				 */
				case MESSAGE_ENCOUNTERED_ERROR:
					// obj will contain a string representing the error message
					if(msg.obj != null && msg.obj instanceof String)
					{
						String errorMessage = (String) msg.obj;
						dismissCurrentProgressDialog();
						displayMessage(errorMessage);
					}
					break;
					
				default:
					// nothing to do here
					break;
			}
		}
	};
	
	/**
	 * If there is a progress dialog, dismiss it and set progressDialog to
	 * null.
	 */
	public void dismissCurrentProgressDialog()
	{
		if(progressDialog != null)
		{
			progressDialog.hide();
			progressDialog.dismiss();
			progressDialog = null;
		}
	}
	
	/**
	 * Displays a message to the user, in the form of a Toast.
	 * @param message Message to be displayed.
	 */
	public void displayMessage(String message)
	{
		if(message != null)
		{
			Toast.makeText(thisActivity, message, Toast.LENGTH_SHORT).show();
		}
	}
	 
}